// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once // 防止头文件重复包含

#include "Components/GameStateComponent.h" // 游戏状态组件

#include "AimAssistTargetManagerComponent.generated.h" // 生成的头文件

#define UE_API SHOOTERCORERUNTIME_API // 定义API宏

enum class ECommonInputType : uint8; // 通用输入类型枚举前向声明

class APlayerController; // 玩家控制器前向声明
class UObject; // 对象前向声明
struct FAimAssistFilter; // 瞄准辅助过滤器前向声明
struct FAimAssistOwnerViewData; // 瞄准辅助拥有者视图数据前向声明
struct FAimAssistSettings; // 瞄准辅助设置前向声明
struct FAimAssistTargetOptions; // 瞄准辅助目标选项前向声明
struct FCollisionQueryParams; // 碰撞查询参数前向声明
struct FLyraAimAssistTarget; // Lyra瞄准辅助目标前向声明

/**
 * 瞄准辅助目标管理器组件用于收集玩家视图内的所有瞄准辅助目标。
 * 目标必须实现IAimAssistTargetInterface并在ShooterCoreRuntimeSettings中设置的碰撞通道上。
 */
UCLASS(MinimalAPI, Blueprintable) // 最小API，可蓝图化
class UAimAssistTargetManagerComponent : public UGameStateComponent // 继承自UGameStateComponent
{
    GENERATED_BODY() // 生成类主体

public:

    /** 基于给定的本地玩家及其ViewTransform获取所有可见的活动目标 */
    UE_API void GetVisibleTargets(const FAimAssistFilter& Filter, const FAimAssistSettings& Settings, const FAimAssistOwnerViewData& OwnerData, const TArray<FLyraAimAssistTarget>& OldTargets, OUT TArray<FLyraAimAssistTarget>& OutNewTargets); // 获取可见目标

    /** 基于玩家当前输入类型获取玩家控制器的视野缩放。 */
    static UE_API float GetFOVScale(const APlayerController* PC, ECommonInputType InputType); // 获取视野缩放

    /** 获取应用于在玩家视图中查找目标的碰撞通道。 */
    UE_API ECollisionChannel GetAimAssistChannel() const; // 获取瞄准辅助通道
    
protected:

    /**
     * 如果给定目标基于当前玩家拥有者数据通过过滤器则返回true。
     * 如果给定目标应从瞄准辅助计算中排除则返回false 
     */
    UE_API bool DoesTargetPassFilter(const FAimAssistOwnerViewData& OwnerData, const FAimAssistFilter& Filter, const FAimAssistTargetOptions& Target, const float AcceptableRange) const; // 目标是否通过过滤器

    /** 基于当前视图数据确定给定目标是否可见。 */
    UE_API void DetermineTargetVisibility(FLyraAimAssistTarget& Target, const FAimAssistSettings& Settings, const FAimAssistFilter& Filter, const FAimAssistOwnerViewData& OwnerData); // 确定目标可见性
    
    /** 基于过滤器设置设置CollisionQueryParams以忽略一组actor。例如忽略请求者或发起者。 */
    UE_API void InitTargetSelectionCollisionParams(FCollisionQueryParams& OutParams, const AActor& RequestedBy, const FAimAssistFilter& Filter) const; // 初始化目标选择碰撞参数
};

#undef UE_API // 取消定义API宏